package cn.tedu.v1_2.socket;

import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 网络通讯---Socket【套接字】理解：互联网型java类
 *
 * 网络应用遵循的原则：
 * C/S架构 Client 客户端   Server   服务器   早期应用【手机app--手机应用】
 * JavaSE 桌面级软件--java并不擅长
 *
 * B/S加构 Browser浏览器端 Server 服务端后期应用【后台语言]
 * *JavaSE 做逻辑Mysql保存数据  Web---Java管理后台
 *
 * 客户端 类：Client----->网络通讯 Socket
 * 服务器端 类：Server----> 网络通讯 ServerSocket
 *
 * 网络通讯  ServerSocket、Socket--底层传输协议支持两种
 * TCP协议：可靠性号传输协议，基于字节流--传输低、安全性高【√传数据】
 * UDP协议：不可靠传输协议，基于数据报--传输高，安全低【游戏】
 * 以上两种协议，封装底层代码中
 *
 *
 * 需求：通过IP+端口    别人链接上自己    相互建议链接
 * 需求2：相互建议链接 ：开启服务端--客户端给服务端发送：文本
 *        提示：start()    写逻辑
 *   网络通讯 Socket，具备方法，支持标准流
 *     客户端|服务端-----Socket对象---调用方法
 *                                 getInputStream()获取输入流
 *                                 getOutputSream()获取输出流
 *
 */

/**
 * 聊天室Version2
 *
 * 功能：客户端--指定IP，端口号
 *      2.客户端给服务器发送文本
 *      3.客户端完成标准IO
 *      【新增】4.捕获异常，打印异常信息--异常全部抓住，用户明确提示
 *      5.关闭socket
 * 客户端
 */
public class Client {
    //1.创建私有的 Socket类--->作用域
    private Socket socket;

    public Client() {
        try {
            socket = new Socket("172.20.10.12", 1019);
        } catch (UnknownHostException e) {//用户地址出问题异常
            System.out.println("IP地址有问题，请询问服务器端！");
        } catch (IOException e) {//IO异常：连接失效，客户端主动退出了
            System.out.println("客户端主动退出了：断开连接");
        }
    }

    //3.创建方法 start() 逻辑  使用IO流 写出
    public void start() {
        PrintWriter pw = null;//置空流
        try {
            OutputStream os = socket.getOutputStream();
            //低级流---OutputStream【抽象父类】与FileOutputStream【子类】
            //高级流---转换流，目的：指定编码集 UTF8
            OutputStreamWriter osw = new OutputStreamWriter(os, "UTF8");
            //高级流--字符输出流，目的：高效数据传输
            BufferedWriter bw = new BufferedWriter(osw);
            //高级流---PrintWriter,目的：输出一行行文本,第二次参数：true！没有一次性推送
            pw = new PrintWriter(bw, true);
            //客户端一直跟服务器端--说【循环】
            System.out.println("客户端用户：请输入文字：");
            Scanner input = new Scanner(System.in);//测试--控制台输入文本
            while (true) {//死循环---一直与服务器说话
                String say = input.nextLine();
                pw.println(say);  //写出 一行行文字
                System.out.println("写出完毕");
            }
        } catch (UnsupportedEncodingException e) {
            System.out.println("客户端与服务器端：字符集不一致！");
        } catch (IOException e) {
            System.out.println("客户端断开了链接");
        } finally {
            //关闭流  关闭socket
            if (pw != null)
                pw.close();
            try {
                socket.close();
            } catch (IOException e) {
                System.out.println("客户端离开");
            }
        }
    }
    //读入
    //  while (true){
//String str=br.readLine();
    //  System.out.println("服务器说话"+str);
    //  }


    //4.创建主方法---Client类运行
    public static void main(String[] args) {
        //5.创建客户端类--默认构造器--调用实例化 Socket:IP,端口
        Client client = new Client();
        //6.调用开始方法---传输数据：IO
        client.start();
    }
}


